/*
 * @Author: 李超越 1509572300@qq.com
 * @Date: 2024-08-07 11:26:04
 * @LastEditors: 李超越 1509572300@qq.com
 * @LastEditTime: 2024-08-10 19:42:54
 * @FilePath: /my_git/lesson27_sign/sigset.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <string>
#include <cassert>
#include <signal.h>
#include <sys/wait.h>
using namespace std;

// void PrintSig(sigset_t &pending)
// {
//     for(int signo=31;signo>0;signo--)
//     {
//         if(sigismember(&pending,signo))
//         {
//             cout<<"1";
//         }
//         else
//         {
//             cout<<"0";
//         }
//     }
//     cout<<endl;
// }

// void handler(int signo)
// {
//     cout<<signo<<endl;
// }

// int main()
// {
//     //捕获2号信号
//     signal(2,handler);
//     sigset_t block,oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     sigaddset(&block,2);//SIGINT--设置进PCB BLOCK位图
//     // for(int signo=1;signo<=31;signo++)
//     // {
//     //     sigaddset(&block,signo)//9,19号信号无法被屏蔽
//     // }
//     int n=sigprocmask(SIG_SETMASK,&block,&oblock);
//     assert(n==0);
//     int cnt=0;
//     while(true)
//     {
//         sigset_t pending;
//         sigemptyset(&pending);
//         n=sigpending(&pending);
//         assert(n==0);
//         PrintSig(pending);
//         cnt++;
//         sleep(1);
//         if(cnt==20)//解除堵塞，屏蔽
//         {
//             n=sigprocmask(SIG_UNBLOCK,&block,&oblock);
//             assert(n==0);
//         }
//     }
//     return 0;
// }


void Print(sigset_t &pending)
{
    for(int i=31;i>=0;i--)
    {
        if(sigismember(&pending,i))
        {
            cout<<1;
        }
        else
        {
            cout<<0;
        }
    }
    cout<<endl;
}

void handler(int signo)
{
    cout<<"signal :"<<signo<<endl;
    sigset_t pending;
    sigemptyset(&pending);
    while(true)
    {
        sigpending(&pending);
        Print(&pending);
        sleep(1);
    }
}

void CleanupChild(int sign)
{
    if(signo==SIGCHLD)
    {
        pid_t rid=waitpid(-1,nullptr,0);
        if(rid>0)
        {
            cout<<"wait child success"<<rid<<endl;
        }
    }

    // if(signo==SIGCHLD)
    // {
    //     while(true)
    //     {
    //         pid_t rid=waitpid(-1,nullptr,0);
    //         if(rid>0)
    //         {
    //             cout<<"wait child success"<<rid<<endl;
    //         }
    //         else
    //         {
    //             break;
    //         }
    //     }
    // }

    // if(signo==SIGCHLD)
    // {
    //     while(true)
    //     {
    //         pid_t rid=waitpid(-1,nullptr,0);
    //         if(rid>0)
    //         {
    //             cout<<"wait child success"<<rid<<endl;
    //         }
    //         else if(rid<=0)
    //         {
    //             break;
    //         }
    //     }
    // }
}

int main()
{
    signal(SIGCHLD,CleanupChild);
    signal(SIGCHLD,SIG_IGN);
    for(int i=0;i<100;i++)
    {
        pid_t id=fork();
        if(id==0)
        {
            int cnt;
            while(cnt--)
            {
                cout<<"I am a Child proccess";
                sleep(1);
            }
        }
    }
}


// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler=handler;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,3);
//     sigaction(a,&act,&oact);
//     while(true)
//     {
//         sleep(1);
//     }
//     return 0;
// }